package task

import (
	"crawler/data"
	"crawler/tools"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"math/rand"
	"net/http"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"time"
)


type AutoUpdate struct {
	Url string //版本信息下载路径
	Softname string //软件名
	CurrVer string //当前版本
	CurrName string //当前运行路径及文件名
}

func (au *AutoUpdate) Update() error {
	if strings.HasSuffix(au.CurrName, "_update.exe") { //开始更新
		time.Sleep(3 * time.Second)
		if au.copyFile() {
			cmd := exec.Command("cmd", "/c", "start", filepath.Dir(au.CurrName)+"/"+au.Softname+".exe")
			cmd.Start()
			cmd.Wait()
			os.Exit(0)
		}
		tools.ShowMessage("程序需要升级")
	} else { //检测更新
		resp, err := http.Get(au.Url +"?num=" + fmt.Sprintf("%d", rand.Intn(1000)))
		if err != nil {
			return err
		}
		defer resp.Body.Close()
		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			return err
		}
		verInfo:=new(data.VersionInfo)
		err =json.Unmarshal(body,verInfo)
		if err != nil {
		    return err
		}
		     fmt.Println("远端版本号:", verInfo.Version)
		     fmt.Println("本地版本号:", au.CurrVer)
		if verInfo.Version != au.CurrVer {
			tools.ShowMessage("程序需要升级")
			show()
			if err := au.getNewVer(verInfo.Url); err != nil {
				return err
			} else {
				cmd := exec.Command("cmd", "/c", "start", filepath.Dir(au.CurrName)+"/"+au.Softname+"_update.exe")
				cmd.Start()
				cmd.Wait()
				os.Exit(0)
			}
		} else {
			os.Remove(au.Softname+"_update.exe")
		}
	}
	return nil
}
func show()  {
	Form1.Button2.SetEnabled(false)
	Form1.Button2.SetCaption("升级中..")
}
func (au *AutoUpdate) getNewVer(url string) error {
	//client := http.Client{Timeout: 900 * time.Second}
	//fmt.Println("开始下载")
	//resp, err := client.Get(url + "?num=" + fmt.Sprintf("%d", rand.Intn(1000)))
	//if err != nil {
	//	return err
	//}
	//defer func() {
	//	fmt.Println("下载完成")
	//}()
	//defer resp.Body.Close()
	//if resp.Status == "200 OK" {
	//	newFile, err := os.Create(au.Softname+"_update.exe")
	//	if err != nil {
	//		return err
	//	}
	//	defer newFile.Close()
	//	_, err = io.Copy(newFile, resp.Body)
	//	if err != nil {
	//		return err
	//	}
	//	return nil
	//} else {
	//	return errors.New(resp.Status)
	//}
	p,_:=filepath.Abs(au.Softname+"_update.exe")
	err:= DownloadFile(p,url)
	if err != nil {
	   return err
	}
	return nil
}

func (au *AutoUpdate) copyFile() bool {
	source_open, err := os.Open(au.CurrName)
	if err != nil {
		return false
	}
	defer source_open.Close()
	dest_open, err := os.OpenFile(filepath.Dir(au.CurrName)+"/"+au.Softname+".exe", os.O_CREATE|os.O_WRONLY, 644)
	if err != nil {
		return false
	}
	defer dest_open.Close()
	//进行数据拷贝
	_, copy_err := io.Copy(dest_open, source_open)
	if copy_err != nil {
		return false
	} else {
		return true
	}
}
